OK,今天要來說說Code的部分,上一篇我們把資料儲存在Google Sheet中,那今天就是程式碼的解說,這次程式碼的loop就使用到非常少,因為此次程式利用到方法。
這個技巧在許多城市中都很常遇見,這大幅減少主程式的程式碼,而變成在需要用到時再去使用,類似於函式,下面會開始講解上次的程式碼。
void loop() {
initWifi();
makeIFTTTRequest();
//delay(20000); //Send Time
// enable timer deep sleep
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
Serial.println("Going to sleep now");
// start deep sleep for 3600 seconds (60 minutes)
esp_deep_sleep_start();
}
是否有看見在第32、33、36行,都寫上一段程式,但如果你跑去網路上查詢此段意思可能查無結果,因為該段程式碼就寫在程式裡面,只是透過這幾行去呼叫而已,舉例第32行執行後,程式會接續去呼叫第43行的initWifi(),那當initWifi()這區塊程式跑完。就又會回到loop中接續執行第33行,然後就持續接續下去。
void initWifi() {
Serial.print("Connecting to: ");
Serial.print(ssid);
WiFi.begin(ssid, password);
int timeout = 10 * 4; // 10 seconds
while(WiFi.status() != WL_CONNECTED && (timeout-- > 0)) {
delay(250);
Serial.print(".");
}
Serial.println("");
if(WiFi.status() != WL_CONNECTED) {
Serial.println("Failed to connect, going back to sleep");
}
Serial.print("WiFi connected in: ");
Serial.print(millis());
Serial.print(", IP address: ");
Serial.println(WiFi.localIP());
}
// Make an HTTP request to the IFTTT web service
void makeIFTTTRequest() {
Serial.print("Connecting to ");
Serial.print(server);
WiFiClient client;
int retries = 5;
while(!!!client.connect(server, 80) && (retries-- > 0)) {
Serial.print(".");
}
Serial.println();
if(!!!client.connected()) {
Serial.println("Failed to connect...");
}
Serial.print("Request resource: ");
Serial.println(resource);
// Temperature in Celsius
String jsonObject = String("{\"value1\":\"") + myAHT10.readTemperature() + "\",\"value2\":\"" + myAHT10.readHumidity() + "\"}";
client.println(String("POST ") + resource + " HTTP/1.1");
client.println(String("Host: ") + server);
client.println("Connection: close\r\nContent-Type: application/json");
client.print("Content-Length: ");
client.println(jsonObject.length());
client.println();
client.println(jsonObject);
int timeout = 5 * 10; // 5 seconds
while(!!!client.available() && (timeout-- > 0)){
delay(100);
}
if(!!!client.available()) {
Serial.println("No response...");
}
while(client.available()){
Serial.write(client.read());
}
Serial.println("\nclosing connection");
client.stop();
}
像這種前面有加void xxx()的這種,代表進入到這方法時只單純計算,卻不會回傳數值,而如果遇到前面加型別那救世會回傳數值。
例如
int test(int x){
return x+10;
}
void loop(){
int x = 10;
Serial.print(test(x));
}
當程式跑到第6行要輸出時,會先跑test()這方法,而經過test()這方法後return(回傳)會把x+10在回傳回來,那除了上述寫法還有一種寫法。
int test(int x){
return x+10;
}
void loop(){
int x = 10;
x = test(x);
Serial.print(x);
}
像上面這例子,會到第6行進test()方法中在回傳x+10的數值,在透過第7行輸出,那這兩種都可以使用,只是各位需要記得,當方法有回傳值時,需要拿變數接收或輸出。
好了,因為此次程式碼中運用到許多方法的寫法,所以各位可能都不懂,所以就在這最後的教學又做一點科普,在上一篇的程式碼當中因為大部分也都跟前幾篇的傳輸大同小異,都是對函式庫中的函式做運用,運用的當可以做出更創新的用途,所以希望大家往後可以持續研究且繼續進步,開創出自己的小天地。明天是本次系列的最終章,就用結語來做個圓滿的THE END吧!!